package cn.tedu.thread;
/**本类用于多线程编程实现方案1：继承Thread类的方式来完成*/
public class TestThread1 {
    public static void main(String[] args) {
        //4.创建线程对象进行测试
        /**4.new对应的是线程的新建状态
         * 5.要想模拟多线程，至少得启动2个线程
         * 如果之启动1个线程，是单线程程序*/
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();
        MyThread t3 = new MyThread();
        MyThread t4 = new MyThread();
//        t1.run();
//        t2.run();
//        t3.run();
//        t4.run();
        /**7.start()对应的状态就是就绪状态，会把把刚刚新建好的线程加入到就绪队列之中
         * 至于这个线程什么时候执行，这就是多线程执行的随机性，需要等待OS选中并分配CPU
         * 8.线程的执行具有随机性，也就是说t1-t4具体怎么执行
         * 取决于CPU的调度与时间片的分配，我们是决定不了的
         * 9.执行start()时，底层JVM虚拟机会自动调用我们重写的，包含自己业务的run()*/
        t1.start();
        t2.start();
        t3.start();
        t4.start();
        t1.currentThread();
        /**6.这个run()如果直接这样调用，是没有多线程抢占执行的效果
         * 这个写法只是把代码看作是普通方法来调用，谁先调用，谁先执行*/
    }

}

//1.自定义一个多线程类
class MyThread extends Thread{
    /**1.多线程编程实现方案1：继承Thread类+重写run()*/
    //2.重写run(),run()里是我们自己的业务
    @Override
    public void run() {
        /**2.super.run()表示的是调用父类的业务
         * 我们现在想用自己的业务，所以注释掉*/
//        super.run();
        //3.完成自己的业务，打印10次当前正在执行的线程名称
        for (int i = 0; i < 10; i++) {
            /**3.getname()表示可以获取当前正在执行的线程名称
             * 由于本类继承了Thread类，所有可以直接使用Thread类的这个方法*/
            System.out.println(i+"="+getName());

        }
    }
}